define(["jquery"], function ($) {
  function Widget() {
    this.boundingBox = null;
  }

  Widget.prototype = {
    /**
     * 观察者模式，绑定事件方法
     * @param type
     * @param handler
     * @returns {Widget}
     */
    on: function (type, handler) {
      if (typeof this.handlers[type] == "undefined") {
        this.handlers[type] = [];
      }
      this.handlers[type].push(handler);
      return this;
    },
    /**
     * 观察者模式，消费事件方法
     * @param type
     * @returns {Widget}
     */
    fire: function (type, data) {
      if (this.handlers[type] instanceof Array) {
        var handlers = this.handlers[type];
        for (var i = 0; i < handlers.length; i++) {
          handlers[i](data);
        }
      }
      return this;
    },
    /**
     * 方法：渲染组件
     */
    render: function () {
      this.handlers = {};
      this.renderUI();
      this.bindUI();
      this.syncUI();
      this.boundingBox.appendTo(document.body);
    },
    /**
     * 方法：销毁组件
     */
    destroy: function () {
      this.destructor();
      this.boundingBox.off();
      this.boundingBox.remove();
      this.boundingBox = null;
    },
    /**
     * 接口：添加dom节点
     */
    renderUI: function () {
    },
    /**
     * 接口：绑定事件
     */
    bindUI: function () {
    },
    /**
     * 接口：初始化组件属性
     */
    syncUI: function () {
    },
    /**
     * 接口：销毁组件前的处理
     */
    destructor: function () {
    }
  };

  return new Widget();
})